package com.explorati.design_pattern.hybrid.specification;

import java.util.ArrayList;

public class Client {

	public static void main(String[] args) {
		ArrayList<User> userList = new ArrayList<>();
		userList.add(new User("张三", 23));
		userList.add(new User("李四", 61));
		userList.add(new User("王五", 64));
		userList.add(new User("张丽", 35));
		userList.add(new User("李鹏", 72));
		userList.add(new User("王艳", 18));
		userList.add(new User("王小二", 14));
		userList.add(new User("李张", 32));
		// 定义一个用户查询类
		IUserProvider userProvider = new UserProvider(userList);
		// 打印姓张的用户
		System.out.println("============姓张的用户============");
		for (User u : userProvider.findUser(new UserByNameLike("张%"))) {
			u.show();
		}
		// 打印年龄大于60的用户
		System.out.println("============年龄大于60的用户=========");
		for (User u : userProvider.findUser(new UserByAgeThan(60))) {
			u.show();
		}
		// 打印名字中包含"张"且年龄大于30的用户
		System.out.println("======名字中包含'张'且年龄大于30的用户=====");
		IUserSpecification spec1 = new UserByNameLike("%张%");
		IUserSpecification spec2 = new AndSpecification(spec1, new UserByAgeThan(30));
		for (User u : userProvider.findUser(spec2)) {
			u.show();
		}
		// 打印年龄小于20的用户
		System.out.println("=========年龄小于20的用户=========");
		IUserSpecification spec = new UserByAgeThan(20);
		for (User u : userProvider.findUser(new NotSpecification(spec))) {
			u.show();
		}
	}
}

/*
 * 运行结果：
============姓张的用户============
用户名：张三 	年龄：23
用户名：张丽 	年龄：35
============年龄大于60的用户=========
用户名：李四 	年龄：61
用户名：王五 	年龄：64
用户名：李鹏 	年龄：72
======名字中包含'张'且年龄大于30的用户=====
用户名：张丽 	年龄：35
用户名：李张 	年龄：32
=========年龄小于20的用户=========
用户名：王艳 	年龄：18
用户名：王小二 	年龄：14
*/
